#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

// 1. 不定参使用,__VA_ARGS__用于获取不定参数
#define LOG(fmt, ...) printf("[%s:%d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__);

// 2. 不定参访问
void PrintNum(int count, ...)
{
    va_list ap;          // 定义指针
    va_start(ap, count); // 获取format后的第一个不定参的起始地址
    for (int i = 0; i < count; i++)
    {
        int num = va_arg(ap, int);
        printf("param[%d]: %d\n", i, num);
    }
    va_end(ap); // 将指针释放
}

// 3. 模拟实现printf
void myprintf(const char *format, ...)
{
    va_list ap;
    va_start(ap, format);
    char buffer[1024];
    // int n = vsnprintf(buffer, sizeof(buffer), format, ap);
    char *res;
    int n = vasprintf(&res, format, ap); // 该函数会在内部申请空间，然后根据format从ap开始提取数据，格式化组织放到res
    if (n != -1)
    {
        buffer[n] = 0;
        printf("%s\n", res);
    }
    free(res); // 必须释放
}
int main()
{
    LOG("%s\n", "this test code...");
    PrintNum(5, 1, 2, 3, 4, 5);
    myprintf("%s %d", "hello git-", 1);
    return 0;
}
